﻿/*****************************************************
**Copyright(C), 2021-2022, Ciqtek Technology.
**Version:     dev
**Author:      MiPeng
**Date:        2021/11/15
**Description: 整数输入框
*****************************************************/

#ifndef SPINBOX_H
#define SPINBOX_H

#include "../generalui_global.h"
#include "../GlobalUIDef.h"

#include <QPoint>
#include <QLabel>
#include <QLineEdit>
#include <QSpinBox>

namespace GeneralUI {

	class GENERALUI_EXPORT SpinBox : public QSpinBox
	{
		Q_OBJECT
		Q_PROPERTY(bool isMapping READ isScreenMapping WRITE setScreenMapping)

	public:
		explicit SpinBox(QWidget * = nullptr);
		~SpinBox();

		/**
		 * @brief  getLineEdit            获取输入控件对象
		 * @return QLineEdit *
		 */
		QLineEdit * getLineEdit();

	public:
		/**
		 * @brief  setScreenMapping       设置是否响应全屏映射
		 * @param  mapping
		 * @return void
		 */
		void setScreenMapping(bool mapping);

		/**
		 * @brief  isScreenMapping        获取全屏映射
		 * @return void
		 */
		bool isScreenMapping();

		/**
		 * @brief  setSpecialValueText  设置特殊文本
		 * @param  text
		 * @param  autoHide  文本自动隐藏：在输入框得到焦点后，特殊文本隐藏，显示最小值
		 * @return void
		 * @note  当输入框值等于最小值时，输入框会显示此文本，
		 */
		void setSpecialValueText(const QString &text, const bool autoHide = false);

		/**
		 * @brief  specialValueText
		 * @return  QString
		 */
		QString specialValueText(bool &autoHide);

	protected:
		/**
		 * @brief  eventFilter            事件过滤器
		 * @param  obj
		 * @param  event
		 * @return bool
		 */
		bool eventFilter(QObject *obj, QEvent *event);

		/**
		 * @brief  keyPressEvent          键盘事件
		 * @param  event
		 * @return void
		 */
		void keyPressEvent(QKeyEvent *event);

		/**
		 * @brief  focusInEvent  焦点事件
		 * @param  event
		 * @return void
		 * @note  处理特殊文本显示隐藏
		 */
		void focusInEvent(QFocusEvent *event);
		void focusOutEvent(QFocusEvent *event);

		/**
		 * @brief  wheelEvent  焦点事件
		 * @param  event
		 * @return void
		 */
		void wheelEvent(QWheelEvent* event);

	private:
		/**
		 * @brief  init                   初始化
		 * @return void
		 */
		void init();

		/**
		 * @brief  updateValue           按位增减
		 * @param  up                     true-加， false-减
		 * @return void
		 */
		void updateValue(bool isAdd);

	private:
		/** 输入框
		 */
		QLineEdit *m_lineEdit;

		/** 是否全屏映射
		 */
		bool m_isMapping;

		/** 鼠标右键是否按下
		 */
		bool m_rightButtonPressed;

		/** 上次移动的位置
		 */
		double m_lastPosX;

		/** 鼠标点击的位置，映射结束后恢复鼠标位置
		 */
		QPointF m_lastPoint;

		/** 屏幕宽度
		 */
		double m_screenWidth;

		/**  特殊文本自动隐藏
		 */
		bool m_specialTextAutoHide;

		/**  特殊文本
		 */
		QString m_specialText;

		/**  上次数值
		 */
		int m_lastValue;
	};

}//namespace GeneralUI

#endif // SPINBOX_H
